﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using POSGui.Classes;

namespace POSGui.Views
{
    public partial class Menu : Page
    {
        private EventHandlerManager _eventHandlerManager;
        bool _isAdmin;

        //private PosUser _user;
        //private SystemVariable _systemVariable;

        /// <summary>
        /// Método que se dispara al cargar la página
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load(object sender, EventArgs e)
        {
            _eventHandlerManager = new EventHandlerManager(Response);
            _isAdmin = true;
            /*var systemV = GetValuefromSession(Constants.SYSTEM_SESSION_VAR);
            if (systemV == null){ Response.Redirect(Constants.PAGE_LOGIN, true); return;}
            _systemVariable = (SystemVariable) systemV;
            // se borra toda venta de la sesion en caso de que exista una
            StoreValuetoSession(Constants.SHOPPING_CART_VAR, null);
            StoreValuetoSession(Constants.CURRENT_SALE_VAR, null);*/
            // se carga el usuario
            //_user = _systemVariable.User;
            
            CreatePermissionsMenu();
            UpdateUserInfo();
        }


        /// <summary>
        /// Método que actualiza la información del usuario.
        /// </summary>
        public void UpdateUserInfo()
        {
            try
            {
                var userLabel = new Label();
                //var textInfo = string.Format("<p>Nombre: {0} <Br/>Rol: {1} <Br/>Caja: {2}</p>", _user.Name, _user.Role, _systemVariable.Cashier.CashierNumber);
                var textInfo = string.Format("<p>Nombre: {0} <Br/>Rol: {1} <Br/>Caja: {2}</p>", "Usuario", "Role", "Sucursal");
                userLabel.Text = textInfo;
                homeinfo.Controls.Add(userLabel);
            }
            catch (Exception)
            {
                Session.Clear();
                Response.Redirect(Constants.PAGE_LOGIN, true);
            }
        }


        /// <summary>
        /// Método que crea un menú de permisos para un usuario según el rol que posea
        /// </summary>
        public void CreatePermissionsMenu()
        {
            var listaPermisos = GetPermissionsNamesFromRole(_isAdmin);

            var menuTable = new Table();
            var rows = listaPermisos.Count % 3;
            rows += listaPermisos.Count / 3;

            for (var currentRow = 0; currentRow < rows; currentRow++)
            {
                var lastRow = new TableRow();
                menuTable.Rows.Add(lastRow);

                for (var columns = 0; columns < 3; columns++)
                {
                    var lastCell = new TableCell();
                    lastRow.Cells.Add(lastCell);


                    if (currentRow * 3 + columns < listaPermisos.Count)
                    {
                        CreatePermissionButton(listaPermisos[(currentRow * 3 + columns)], lastCell);
                    }
                }
            }

            homemenu.Controls.Add(menuTable);
        }

        /// <summary>
        /// Método que crea un nuevo botón acorde al nombre de un permiso.
        /// </summary>
        /// <param name="name">Nombre del permiso</param>
        /// <param name="cell">Celda de la tabla a la cual se agregará el permiso</param>
        private void CreatePermissionButton(String name, TableCell cell)
        {
            string permissionName = name;

            var permission = new ImageButton
                                 {
                                     ID = "Button" + permissionName,
                                     ImageUrl =
                                         Constants.BUTTONS_URI + permissionName + Constants.BUTTON_TYPE_PLAIN +
                                         Constants.IMAGE_TYPE,
                                 };
            permission.Click += _eventHandlerManager.getHandler(permissionName);
            permission.Attributes.Add("runAt", "server");
            permission.Attributes.Add("onmouseout",
                                      "this.src='" + Constants.BUTTONS_URI + permissionName +
                                      Constants.BUTTON_TYPE_PLAIN +
                                      Constants.IMAGE_TYPE + "';");
            permission.Attributes.Add("onmouseover",
                                      "this.src='" + Constants.BUTTONS_URI + permissionName +
                                      Constants.BUTTON_TYPE_FOCUS +
                                      Constants.IMAGE_TYPE + "';");

            cell.Controls.Add(permission);
        }

        /// <summary>
        /// Método que obtiene los nombres de los modulos a los que tiene acceso un usuario.
        /// </summary>
        /// <returns>La lista de los nombres de los módulos</returns>
        public List<String> GetPermissionsNamesFromRole(bool isAdmin)
        {
            var resultList = new List<string>();

            resultList.Add("Ventas");

            //Modulos del sistema
            if (isAdmin)
            {
                resultList.Add("Devoluciones");
                resultList.Add("Configuracion");
            }            
            
            return resultList;
        }


        #region Misc Methods
        /*/// <summary>
        /// Metodo que permite ingresar un valor a la sesion
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        private void StoreValuetoSession(string key, object value)
        {
            Session[key + GetSessionUser()] = value;
        }


        /// <summary>
        /// Metodo que permite obtener un valor de la sesion
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        private Object GetValuefromSession(string key)
        {
            return Session[key + GetSessionUser()];
        }

        /// <summary>
        /// Metodo que permite obtener la session actual
        /// </summary>
        /// <returns>String con el identificador de la session actual</returns>
        private String GetSessionUser()
        {
            var cookie = Request.Cookies.Get(FormsAuthentication.FormsCookieName);
            if (cookie == null)
            {
                return null;
            }
            var decrypted = FormsAuthentication.Decrypt(cookie.Value);
            return decrypted.UserData;
        }*/
        #endregion

    }
}
